#include <iostream>
#include <unistd.h> //unistd.h  pause
#include <signal.h> //signal sigaction sigprocmask
#include <sys/wait.h>

using namespace std;

int local_val = 1;
void handler(int signal)
{
    local_val = 0; //接受信号后将值设为0,让主函数里的while循环退出.
    cout << "local_val = 0" << endl;
}
int main()
{
    signal(SIGINT,handler);
    while(local_val)
    {
        
    }

    return 0;
}

// void handler_child(int signal)
// {
//     while (true)
//     {
//         int ret = waitpid(-1, nullptr, WNOHANG);
//         if (ret > 0)
//         {
//             cout << "wait a child";
//         }
//         else if (ret == 0)
//         {
//             break;
//         }
//         else
//         {
//             cout << "wait error!!!" << endl;
//             break;
//         }
//     }
// }

// int main()
// {
//     sigignore(SIGCHLD); //忽略信号
//     for (size_t i = 0; i < 10; i++)//创建10个子进程
//     {
//         int pid = fork();
//         if (pid == 0)
//         {
//             if (i < 6) //让留个进程先退出
//             {
//                 sleep(2);
//                 exit(0);
//             }
//             else //剩下四个进程过几秒再退出
//             {
//                 sleep(6);
//                 exit(0);
//             }
//         }
//     }
//     while (true)
//     {
//         cout << "父进程运行中,,,," << endl;
//         sleep(1);
//     }
//     return 0;
// }

// void print_signal(sigset_t sig)
// {
//     cout << "pending(普通信号):";
//     for(int i = 31 ; i>= 1 ; i--)
//     {
//         if(sigismember(&sig,i))
//         {
//             cout << 1;
//         }
//         else
//             cout << 0;
//     }
//     cout << endl;
// }

// void handler_alrm(int signal)
// {
//     cout << "解除SIGINT信号的阻塞,结束进程..." << endl;
//     sigset_t set;
//     sigemptyset(&set);
//     sigdelset(&set,SIGINT);
//     sigprocmask(SIG_SETMASK,&set,nullptr);
//     cout << "------------------------";
//     cout << "更新后的pending 表:";
// }

// int main()
// {
//     sigset_t set,old_set;
//     //sigset(SIGINT,SIG_HOLD);
//     sigaddset(&set,SIGINT);
//     sigprocmask(SIG_SETMASK,&set,&old_set);

//     alarm(5);
//     signal(SIGALRM,handler_alrm);
//     while(true)
//     {
//         sigpending(&set);
//         print_signal(set);
//         sleep(1);
//     }
//     return 0;
// }

#ifdef MYKILL_CPP

// void handler(int single)
// {
//     cout << "信号: " << single << "被自定义捕捉啦!!!" << endl;
// }
int count = 0;
void sigcb(int single)
{
    cout << "信号 : " << single << "被捕捉啦\n";
    cout << count << endl;
    exit(1);
}

void print_pending_sig(sigset_t pending_set)
{
    for (int i = 64; i >= 1; i--)
    {
        printf("%d", sigismember(&pending_set, i) ? 1 : 0);
        if (i == 33)
            printf(" ");
    }
    cout << endl;
}

int main()
{
    // kill/raise函数使用
    sleep(3);
    // kill(getpid(),SIGKILL);
    // raise(SIGKILL);
    abort();

    // //感受没有IO的飞快
    // signal(SIGALRM,sigcb);
    // alarm(1);
    // while(true)
    // {
    //     count++;
    // }

    // //感受IO效率之慢
    // alarm(1);
    // int count = 0;
    // while(true)
    // {
    //     cout << "count = " << count++ << endl;
    // }

    // 基础的alarm使用
    //  signal(SIGALRM,sigcb);
    //  alarm(1);
    //  while(true)
    //  {
    //      pause();
    //  }

    // //使用sigprocmask函数阻塞2号信号和40号信号
    // sigset_t pending_set;
    // sigaddset(&pending_set,SIGINT);
    // sigaddset(&pending_set,SIGRTMIN+6);
    // sigprocmask(SIG_SETMASK ,&pending_set ,nullptr);

    // struct sigaction act;
    // act.sa_handler = sigcb;

    // while(true)
    // {
    //     sigpending (&pending_set);
    //     if(sigismember(&pending_set,2))
    //         cout << "信号2在pending表,被阻塞啦" << endl;
    //     if(sigismember(&pending_set,40))
    //         cout << "信号40在pending表,被阻塞啦" << endl;
    //     sleep(1);
    //     print_pending_sig(pending_set);
    // }

    // 捕捉SIGINT信号
    // signal(SIGINT,sigcb);

    // 使用sigaction函数捕捉SIGINT信号
    //  struct sigaction act , old_act;
    //  act.sa_handler = sigcb;
    //  act.sa_flags = SA_RESTART;
    //  sigemptyset(&act.sa_mask);

    // sigaction(SIGINT,&act,&old_act);
    // while(true)
    // {
    //     pause();
    // }

    // 测试无法被捕捉的信号(9,19)
    //  for (int i = 1; i <= 31; i++)
    //  {
    //      sighandler_t ret = signal(i, handler);
    //      if (ret == SIG_ERR)
    //          cout << "信号 : " << i << "捕捉失败!!" << endl;
    //  }

    // while (true)
    // {
    //     cout << "哈哈哈哈" << endl;
    //     sleep(1);
    // }

    // status位运算解析(包括core dump核心转储)
    //  pid_t pid = fork();
    //  if (pid == 0)
    //  {
    //      sleep(1);
    //      printf("hahahahah~\n");
    //      printf("hahahahah~\n");
    //      printf("hahahahah~\n");
    //      printf("hahahahah~\n");
    //      printf("%d", 1 / 0);
    //      printf("hahahahah~\n");
    //      printf("hahahahah~\n");
    //  }
    //  int status = -1;
    //  waitpid(pid, &status, 0);

    // printf("%d , %d , %d\n",(status>>8) & 0xFF , (status>>7)&0x1 , (status)&0x7F);
    // printf("%d , %d , %d\n", WIFEXITED(status), (status>>7)&0x1 , WTERMSIG(status));
    return 0;
}

// typedef void (*handler)(int signal);

// void func(int signal)
// {
//     cout << "收到信号:" << signal << endl;
// }

// int main()
// {
//     sighandler_t s = signal(2,func);
//     while(true)
//     {
//         cout << "程序运行中" << endl;
//         sleep(1);
//     }

//     return 0;
// }
#endif
